#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试 client 特殊文件(mknod)的创建和删除"
echo -e "***********************************************************************"

tmp_dir="/test_mknod"
abs_tmp_dir="${MountPoint}${tmp_dir}"

function mknod_all_files()
{
    test_cmd "mknod ${abs_tmp_dir}/tmp_fifo p"
    test_cmd "mknod ${abs_tmp_dir}/tmp_dev_full c 1 7"
    # 创建 本地 socket 文件
    echo "nc ok" > /tmp/haha
    rm -f ${abs_tmp_dir}/tmp_sock
    test_cmd_nohup "nc -Ul ${abs_tmp_dir}/tmp_sock"
    nc -U ${abs_tmp_dir}/tmp_sock < /tmp/haha
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时 mknod------"
    mknod_all_files
    clean_dir ${abs_tmp_dir}
}

function test_dir_quota()
{
    echo -e "\n------test_dir_quota------"
    create_quota ${tmp_dir} "--hardnum=1000"
    
    mknod_all_files
    sleep 1
    check_usedsize_and_usednum ${tmp_dir}
    
    clean_dir ${abs_tmp_dir}
    # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    sleep 1
    check_usedsize_and_usednum ${tmp_dir}

    remove_quota_dir ${tmp_dir}
}

function test_dir_quota_exceed()
{
    echo -e "\n------test_dir_quota_exceed------"
    limits="--hardnum=2"
    create_quota ${tmp_dir} ${limits}
    #mknod_all_files
set +e
    mknod ${abs_tmp_dir}/tmp_fifo p
set -e
    sleep 1
    check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_uid_quota()
{
    echo -e "\n------test_uid_quota------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=4 --uid=${SysUid}"

    su ${SysUser} <<EOF
        set -x
        mknod ${abs_tmp_dir}/tmp_fifo p
        mknod ${abs_tmp_dir}/tmp_fifo1 p
        set +x
EOF
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_uid_quota_exceed()
{
    echo -e "\n------test_uid_quota_exceed------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}
    create_quota ${tmp_dir} "--hardnum=2 --uid=${SysUid}"

set +e # 下面执行的命令将因超出配额而失败，但是符合预期
    su ${SysUser} <<EOF
        set -x
        mknod ${abs_tmp_dir}/tmp_fifo p
        mknod ${abs_tmp_dir}/tmp_fifo1 p
        set +x
EOF
set -e
    sleep_check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

mkdir -p ${abs_tmp_dir}
clean_dir ${abs_tmp_dir}
orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
chown -R root:root ${abs_tmp_dir}
remove_all_quota_for_dir ${tmp_dir}

test_no_quota  # 测试没有配额时创建和删除文件

test_dir_quota # 测试创建目录配额后 mknod 和删除文件
test_dir_quota_exceed

test_uid_quota
test_uid_quota_exceed

rm_abs_dir ${abs_tmp_dir}